package br.edu.universo.si.projeto2.infojob.server.controlador;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanCurriculoConhecimentos;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanCurriculoCurso;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaPerfil;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanMensagem;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanNacionalidade;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalCurriculo;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanVaga;
import br.edu.universo.si.projeto2.infojob.client.rpc.Service;
import br.edu.universo.si.projeto2.infojob.server.negocio.NConhecimentos;
import br.edu.universo.si.projeto2.infojob.server.negocio.NCurriculo;
import br.edu.universo.si.projeto2.infojob.server.negocio.NEmpresa;
import br.edu.universo.si.projeto2.infojob.server.negocio.NEstado;
import br.edu.universo.si.projeto2.infojob.server.negocio.NEstadoCivil;
import br.edu.universo.si.projeto2.infojob.server.negocio.NLogin;
import br.edu.universo.si.projeto2.infojob.server.negocio.NMensagens;
import br.edu.universo.si.projeto2.infojob.server.negocio.NNacionalidade;
import br.edu.universo.si.projeto2.infojob.server.negocio.NProfissional;
import br.edu.universo.si.projeto2.infojob.server.negocio.NSetoresAtuacao;
import br.edu.universo.si.projeto2.infojob.server.negocio.NTitularidade;
import br.edu.universo.si.projeto2.infojob.server.negocio.NVagas;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PCurriculo;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PCurriculoConhecimento;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PCurriculoCurso;
import br.edu.universo.si.projeto2.infojob.server.persistencia.PLogin;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**
 * Este Servlet faz o papel de controlador, repassando as chamadas para a
 * camada de negócio. 
 */
public class ServiceImpl extends RemoteServiceServlet implements Service
{
	public BeanAssinante login(String conta, String senha) throws Exception
	{
		BeanAssinante bAssinante = PLogin.login(conta, senha);

		setUsuarioSessao(bAssinante);

		return bAssinante;
	}
  
  	/*
  	 * Seta o usuario na sessao
  	 */
	private void setUsuarioSessao(BeanAssinante bAssinante)
	{
		if (bAssinante != null)
		{
			HttpServletRequest request = this.getThreadLocalRequest();
			HttpSession session = request.getSession();

			session.setAttribute("usuario", bAssinante);
		}
	}

	/*
	 * Remove o usuario da sessao
	 */
	private void delUsuarioSessao(BeanAssinante bAssinante)
	{
		if (bAssinante != null)
		{
			HttpServletRequest request = this.getThreadLocalRequest();
			HttpSession session = request.getSession();

			session.removeAttribute("usuario");
		}
	}

	/*
	 * Pega o usuario da sessao
	 */
	private BeanAssinante getUsuarioSessao()
	{
		HttpServletRequest request = this.getThreadLocalRequest();
		BeanAssinante bAssinante = (BeanAssinante) request.getSession().getAttribute("usuario");

		return bAssinante;
	}
  
  public HashMap<Integer, String> getEstados() throws Exception
  {
	  return NEstado.getEstados();
  }

  public void cadastrarEmpresaAssinante(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
  {
	  NEmpresa.cadastrarEmpresa(bEmpresaAssinante);
  }

  public BeanEmpresaAssinante getEmpresaById(Integer idEmpresa) throws Exception
  {
	  return NEmpresa.getEmpresaById(idEmpresa);
  }
  
  public void alterarEmpresaAssinante(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
  {
	  NEmpresa.alterarEmpresaAssinante(bEmpresaAssinante);
  }

  public void cadastrarVaga(BeanVaga vaga) throws Exception
  {
	  NVagas.cadastrarVaga(vaga);
  }

  public void cadastrarEmpresaPerfil(BeanEmpresaPerfil bEmpresaPerfil) throws Exception
  {
	  NEmpresa.cadastrarEmpresaPerfil(bEmpresaPerfil);
  }

  public BeanEmpresaPerfil getEmpresaPerfil(Integer idEmpresa) throws Exception
  {
	  return NEmpresa.getEmpresaPerfil(idEmpresa);
  }
  
  public BeanProfissionalAssinante getProfissionalById(Integer idProfissional) throws Exception
  {
	  return NProfissional.getProfissionalById(idProfissional);
  }

  public void alterarEmpresaPerfil(BeanEmpresaPerfil bEmpresaPerfil) throws Exception
  {
	  NEmpresa.alterarEmpresaPerfil(bEmpresaPerfil);
  }

  public void cadastrarProfissionalAssinante(BeanProfissionalAssinante bProfissionalAssinante) throws Exception
  {
	  NProfissional.cadastrarProfissional(bProfissionalAssinante);
  }

  public HashMap<Integer, String> getEstadosCivis() throws Exception
  {
	  return NEstadoCivil.getEstadosCivis();
  }

  public HashMap<Integer, String> getSetoresAtuacao() throws Exception
  {
	  return NSetoresAtuacao.getSetoresAtuacao();
  }

  public void alterarProfissional(BeanProfissionalAssinante bProfissionalAssinante)
  	throws Exception
  {
	  NProfissional.alterarProfissional(bProfissionalAssinante);
  }
  
  public void alterarSenha(String conta, String senha) throws Exception
  {
	  NLogin.alterarSenha(conta, senha);
  }
  
  public ArrayList<BeanVaga> buscarVagas(BeanVaga filtro) throws Exception
  {
	  return NVagas.buscarVagas(filtro);
  }
  
  public List<BeanNacionalidade> getNacionalidades() throws Exception
  {
	  return NNacionalidade.getNacionalidades();
  }

  public HashMap<Integer, String> getTitularidades() throws Exception
  {
	  return NTitularidade.getTitularidades();
  }

  public BeanVaga getVagaById(Integer idVaga) throws Exception
  {
	  return NVagas.getVagaById(idVaga);
  }

  public void encerrarVaga(BeanVaga bVaga) throws Exception 
  {
	  NVagas.encerrarVaga(bVaga);
  }

  public void excluirVaga(int idVaga) throws Exception 
  {
	  NVagas.excluirVaga(idVaga);
  }
  
  public Boolean excluirCurriculo(Integer idCurriculo) throws Exception
  {
	  return NCurriculo.excluirCurriculo(idCurriculo);
  }

  public HashMap<Integer, String> getConhecimentos() throws Exception
  {
	  return NConhecimentos.getConhecimentos();
  }

  public List<BeanCurriculoCurso> getlistCurriculoCurso(Integer id) throws Exception {

	return PCurriculoCurso.getlistCurriculoCurso(id);
  }

  public Boolean salvarOuAtualizarService(BeanProfissionalCurriculo bcurprof, List<BeanCurriculoConhecimentos> bcurconhecimento) throws Exception {

	Boolean retorno = false;
	try {
	  retorno = PCurriculo.salvarOuAtualizar(bcurprof, bcurconhecimento);
	} catch (Exception e) {
	  e.printStackTrace();
	}
	return retorno;
  }
  
  	public Integer salvarCurriculoCurso(BeanCurriculoCurso bcurriculocurso) throws Exception
  	{
		try
		{
		  return PCurriculoCurso.salvarCursos(bcurriculocurso);
		}
		catch (Exception e)
		{
		  throw new Exception(e.getMessage());
		}
  	}

	public List<BeanCurriculoConhecimentos> getCurriculoConhecimentos(Integer idCurriculo) throws Exception
	{
		return PCurriculoConhecimento.getCurriculoConhecimento(idCurriculo);
	}

	public void inserirCandidato(BeanVaga vaga, BeanProfissionalCurriculo curriculo) throws Exception
	{
		NVagas.inserirCandidato(vaga, curriculo);
	}

	public ArrayList<BeanProfissionalCurriculo> getCurriculos() throws Exception
	{
		BeanProfissionalAssinante bProfissional = (BeanProfissionalAssinante) getUsuarioSessao();

		return NProfissional.getCurriculos(bProfissional);
	}

	public ArrayList<BeanProfissionalCurriculo> getCurriculosByProfissional(int idProfissional) throws Exception
	{
		BeanProfissionalAssinante bProfissional = new BeanProfissionalAssinante();
		bProfissional.setId(idProfissional);

		return NProfissional.getCurriculos(bProfissional);
	}
	
	public void excluirCursoService(BeanCurriculoCurso curCurso) throws Exception
	{
		try
		{
			PCurriculoCurso.excluirCurso(curCurso);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
	}

	
	public ArrayList<BeanMensagem> getMensagensCaixaEntrada() throws Exception
	{
		BeanAssinante assinante = getUsuarioSessao();
		try
		{
			if (assinante instanceof BeanProfissionalAssinante)
			{
				int idDestinatario = ((BeanProfissionalAssinante) assinante).getId();
				return NMensagens.getMensagensCaixaEntrada(idDestinatario);
			}
			else if (assinante instanceof BeanEmpresaAssinante)
			{
				int idDestinatario = ((BeanEmpresaAssinante) assinante).getId();
				return NMensagens.getMensagensCaixaEntrada(idDestinatario);
			}

		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.getMessage());
		}

		return null;
	}
	
	public ArrayList<BeanMensagem> getMensagensCaixaSaida() throws Exception
	{
		BeanAssinante assinante = getUsuarioSessao();

		try
		{
			if (assinante instanceof BeanProfissionalAssinante)
			{
				int idRemetente = ((BeanProfissionalAssinante) assinante).getId();
				return NMensagens.getMensagensCaixaSaida(idRemetente);
			}
			else if (assinante instanceof BeanEmpresaAssinante)
			{
				int idRemetente = ((BeanEmpresaAssinante) assinante).getId();
				return NMensagens.getMensagensCaixaSaida(idRemetente);
			}

		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.getMessage());
		}

		return null;
	}

	public void excluirMensagemCxEntrada(Integer idMensagem) throws Exception
	{
		NMensagens.excluirMensagemCxEntrada(idMensagem);
	}

	public void excluirMensagensCxEntrada(ArrayList<BeanMensagem> clMensagens) throws Exception
	{
		NMensagens.excluirMensagensCxEntrada(clMensagens);
	}

	public void excluirMensagemCxSaida(Integer idMensagem) throws Exception
	{
		NMensagens.excluirMensagemCxSaida(idMensagem);
	}

	public void excluirMensagensCxSaida(ArrayList<BeanMensagem> clMensagens) throws Exception
	{
		NMensagens.excluirMensagensCxSaida(clMensagens);
	}

	public BeanMensagem getMensagemById(Integer idMensagem) throws Exception
	{
		return NMensagens.getMensagemById(idMensagem);
	}

	public void setMensagemLida(BeanMensagem mensagem) throws Exception
	{
		NMensagens.setMensagemLida(mensagem);
	}

	public void enviarMensagem(BeanMensagem mensagem) throws Exception
	{
		mensagem.setRemetente(getUsuarioSessao());

		NMensagens.enviarMensagem(mensagem);
	}
	
	public BeanAssinante getAssinanteById(Integer idAssinante) throws Exception
	{
		return NLogin.getAssinanteById(idAssinante);
	}
	
	public String getRelatorioCurriculoEnviado() throws Exception
	{
		String jasper = this.getServletContext().getRealPath("relatorios/RelatoriocurriculoEnviados.jasper");

		String retorno = PCurriculo.buscarRelatorioCurriculoEnviado(getUsuarioSessao().getId(), jasper);
		if (retorno != ""){
		  return "/prjInfojob/relatorios/RelatoriocurriculoEnviados.pdf";
		} else {
			return "";
		}
	}

	public void logoff() throws Exception
	{
		delUsuarioSessao(getUsuarioSessao());
		return;
	}

	public void encerrarContaEmpresa(BeanEmpresaAssinante bEmpresaAssinante) throws Exception
	{
		NEmpresa.encerrarContaEmpresa(bEmpresaAssinante);
	}

	public void encerrarContaProfissional(BeanProfissionalAssinante bProfissionalAssinante) throws Exception
	{
		NProfissional.encerrarContaProfissional(bProfissionalAssinante);
	}

	public ArrayList<BeanProfissionalAssinante> buscarProfissionais(String nome, Integer idadeLimite, Integer estado, String curso, ArrayList<String> conhecimentos)
		throws Exception
	{
		return NProfissional.buscarProfissionais(nome, idadeLimite, estado, curso, conhecimentos);
	}

	public ArrayList<BeanProfissionalAssinante> getProfissionaisByVaga(int vagaId)
			throws Exception {
		  return NVagas.getProfissionaisByVaga(vagaId);
	}
}